package com.chen.base.module.redis.service;

import com.chen.base.module.redis.inter.LockFunctional;

/**
 * @author: Long
 * @date: 2023/5/3 18:26
 **/
public interface DistributedLock<T> {

    /**
     * 加锁
     * @param key 锁的唯一标识
     * @param expire 锁失效时间，单位：毫秒
     * @return 不为NULL：加锁成功
     */
    LockFunctional lock(String key, long expire);

    /**
     * 解锁
     * @param lockObj 锁对象
     * @return true：解锁成功
     */
    Boolean unLock(T lockObj);

    /**
     * 加锁运行，执行完毕或失败后，解锁
     * 1. 不捕获异常
     * 2. 获取不到锁，不等待，直接返回false
     * @param key 锁的唯一标识
     * @param expire 锁失效时间，单位：毫秒
     * @param fun 加锁后运行的代码
     * @return true：成功运行
     */
    default Boolean lockRun(String key, long expire, Runnable fun){
        LockFunctional locker = lock(key, expire);
        if (locker == null){
            return false;
        }

        try {
            fun.run();
        } finally {
            locker.unLock();
        }
        return true;
    }
}
